#include <string.h>
#include <errno.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/ioctl.h>
#include <sys/stat.h>
#include <mtd/mtd-user.h>

#include "fpga_interface.h"

#define PROGRAM_NAME "fpga_interface"

static int fd1, fd2;

static int fpga_spi_fd;
static uint32_t fpga_spi_mode = 0;
static int8_t fpga_spi_bits = 8;
static uint32_t fpga_spi_speed = 500000;

/**
 * @brief 写入数据到FPGA指定地址
 * 
 * @param page 页号
 * @param offset 偏移量
 * @return uint16_t 
 */
void spi_write_fpga(uint16_t page, size_t offset, uint16_t val)
{

}

/**
 * @brief 从FPGA指定地址读出16位宽的数据
 * 
 * @param page 页号
 * @param offset 偏移量
 * @return uint16_t 
 */
uint16_t spi_read_fpga(uint16_t page, size_t offset)
{
    uint16_t result;
    result = 0;
    return result;
}

/**
 * @brief 初始化FPGA，打开FMC接口，初始化SPI
 * 
 * @return int 
 */
int fpga_init(uint16_t ch)
{
    return 0;
}

int close_fpga(uint16_t ch)
{
    int ret;
    ret = 0;
    return ret;
}

/**
 * @brief 读取FPGA DDR中的数据
 * 
 * @param len 长度
 * @param data 数据地址
 * @param ch 通道号
 * @return int 
 */
int read_fpga_ddr(size_t len, uint8_t *data, uint16_t ch)
{
    /****** 临时测试数据 ******/
    for (int i = 0; i < len; i ++)
    {
        data[i] = i;
    }
    return 0;
}

/**
 * @brief 往FPGA DDR中写入数据
 * 
 * @param len 长度
 * @param data 数据地址
 * @return int 
 */
int write_fpga_ddr(uint32_t len, uint8_t *data)
{
    return 0;

}

/**
 * @brief 设置DDR流控模式
 * 
 * @param val 0:正常模式 1：FMC读写测试模式
 * @return int 
 */
void set_flowctrl_mode(uint16_t val)
{
    spi_write_fpga(2, 0x2d, val);
}
